/*
11.1. O procedimento tcballoc usa uma busca sequencial para encontrar uma TCB livre, o que significa que o over-head da busca é proporcional ao número de conexões TCP concorrentes ativas. Descreva uma implementação que aloca a TCB em tempo constante.

 neste índice.

Implementação:	*/

/* --------------------------- EXEMPLO.C ----------------------------------------------- */

sem_t tcbtab_queue_mutex;
int_queue tcbtab_free_positions;	// F, fila é uma estrutura global.
									// TODO: implementar estrutura int_queue,
									// simples fila de inteiros

// neste local, já foram declarados:
// tcbtab e Ntcp
void init_tcbtab() {
	
	tcbtab = safe_alloc( Ntcp * sizeof(struct tcb) );
	sem_init( &tcbtab_queue_mutex, 1);
	
	for(int i = 0; i < Ntcp; ++i) {
		tcb_set_default_values(i);	// TODO: função tcb_set_default_values(int i);
									// efetua as atribuições default para cada campo
									// do registro TCB (tcb.h)
		
		tcbtab[i]->tcp_state = TCPS_FREE;	// deixei explícito, mas esta linha pode
											// entrar na função tcb_set_default_values

		// esta chamada não precisa ser controlada concorrentemente.
		enqueue(tcbtab_free_positions, i);	// TODO: implementar função 
											// enqueue (enfileirar)
	}
}

// ...

// função que enfileira concorrentemente
 // acho que não vai precisar pq a função de alloc e dealloc já faz isso.
void tcbtab_concurrent_enqueue(int i) {
	sem_wait( &tcbtab_queue_mutex );
	enqueue(tcbtab_free_positions, i);
	sem_post( &tcbtab_queue_mutex );
}

// função que desenfileira concorrentemente
 // acho que não vai precisar pq a função de alloc e dealloc já faz isso.
void tcbtab_concurrent_dequeue() {
	sem_wait( &tcbtab_queue_mutex );
	dequeue(tcbtab_free_positions);
	sem_post( &tcbtab_queue_mutex );
}

// ...

// exemplo:
void alguma_funcao_por_ai() {
	// ...

	// quando precisar alocar uma tcb: (tcballoc.c)
	int i = tcbtab_concurrent_dequeue();
	tcbtab[i]->tcp_state = TCPS_CLOSED;
	// ...
	
	// quando precisar liberar a tcb i: (tcbdealloc.c)
	tdcbtab[i]->tcp_state = TCPS_FREE;
	tcbtab_concurrent_enqueue(i);
}

/*-------------------fim: EXEMPLO.C -----------------------------------------------*/
